home *** CD-ROM | disk | FTP | other *** search
/ Gigarom 4 / Mac Giga-ROM 4.0 - 1993.toast / FILES / MID / Util / Scope.a.cpt / Scope.a next >
Text File  |  1985-12-30  |  8KB  |  290 lines

  1. ; mod 12 30 85 tsh - fix for new digitizer
  2. ; written 5 27 85 Tom Hedges, Fractal Software
  3.  
  4. ;    Example Oscilloscope Program
  5.  
  6.     XDEF    Start
  7.     
  8. ; Bring in all the dirty constants
  9.     INCLUDE    SysEquX.D
  10.  
  11. ; Dirty System Constants
  12. myRow    EQU    45            ;row we start on screen
  13. MotorOff EQU    $0DFF1FF        ;Motor Off Control Base
  14. trigC    EQU    350            ;trigger count max
  15.  
  16.  
  17. ; Data
  18. transTab DS.B    256            ;translate table
  19. oldVal    DS.W    512            ;old screen bit
  20.  
  21.  
  22. ;Initialize All Managers
  23. Start:    PEA    -4(A5)
  24.     DC.W    $A86E    ;_InitGraf
  25.     DC.W    $A8FE    ;_InitFonts
  26.     DC.W    $A912    ;_InitWindows
  27.     DC.W    $A930    ;_InitMenus
  28.     CLR.L    -(SP)
  29.     DC.W    $A97B    ;_InitDialogs
  30.  
  31. ; Setup Translate Table with bit-reversed indices
  32.     LEA    transTab(A5),A0        ;address translate table
  33.     MOVEQ    #0,D4            ;index
  34.     MOVE.W    #255,D3            ;outer loop count (256 entries)
  35. sutrlp:    MOVEQ    #7,D2            ;inner loop counter (8 bits in byte)
  36.     MOVE.W    D4,D0            ;get copy of index
  37. brlp:    LSL.W    #1,D1            ;shift index left one
  38.     BTST.L    #0,D0            ;test low bit of index
  39.     BEQ.S    bitns            ;not set
  40.     ADDQ.W    #1,D1            ;put bit into result
  41. bitns:    LSR.W    #1,D0            ;shift index right one
  42.     DBF    D2,brlp
  43.     MOVE.B    D1,(A0)+        ;store new index
  44.     ADDQ.W    #1,D4            ;bump index
  45.     DBF    D3,sutrlp
  46.  
  47. ; Init oldVal Array to Zeroes
  48.     LEA    oldVal(A5),A0
  49.     MOVE.W    #511,D0
  50. initOV    CLR.W    (A0)+
  51.     DBF    D0,initOV
  52.  
  53. ; Setup Scc
  54.     MOVEM.L    SccRd,A0-A1        ;get the base addresses for Scc
  55.     MOVEQ    #2,D0            ;fudge for Port A
  56.     ADDA.W    D0,A0            ;Scc Read Addr
  57.     ADDA.W    D0,A1            ;Scc Write Addr
  58. ; disable interrupts
  59.     MOVE    SR,-(SP)        ;setup for RTE
  60.     ORI    #$300,SR        ;Disable Interrupts
  61. ; WR 9
  62.     MOVE.B    (A0),D0            ;assure WR0 next
  63.     MOVE.L    (SP),(SP)        ;(delay)
  64.     MOVE.B    #9,(A1)            ;WR 9
  65.     MOVE.L    (SP),(SP)        ;(delay)
  66.     MOVE.B    #$02,(A1)        ;NV only
  67. ; WR 4
  68.     MOVE.L    (SP),(SP)        ;(delay)
  69.     MOVE.B    #4,(A1)            ;WR 4
  70.     MOVE.L    (SP),(SP)        ;(delay)
  71.     MOVE.B    #$0C,(A1)        ;2 stop bits, Asynch Mode
  72. ; WR 1
  73.     MOVE.L    (SP),(SP)        ;(delay)
  74.     MOVE.B    #1,(A1)            ;WR 1
  75.     MOVE.L    (SP),(SP)        ;(delay)
  76.     MOVE.B    #$01,(A1)        ;No Rx/Tx Int, Ext Int ON (Mouse)
  77. ; WR 3
  78.     MOVE.L    (SP),(SP)        ;(delay)
  79.     MOVE.B    #3,(A1)            ;WR 3
  80.     MOVE.L    (SP),(SP)        ;(delay)
  81.     MOVE.B    #$C1,(A1)        ;8 bits per Byte, Rx Enable
  82. ; WR 5
  83.     MOVE.L    (SP),(SP)        ;(delay)
  84.     MOVE.B    #5,(A1)            ;WR 5
  85.     MOVE.L    (SP),(SP)        ;(delay)
  86.     MOVE.B    #$7A,(A1)        ;8 bits/char, send break, Tx enable
  87. ; WR 11
  88.     MOVE.L    (SP),(SP)        ;(delay)
  89.     MOVE.B    #11,(A1)        ;WR 11
  90.     MOVE.L    (SP),(SP)        ;(delay)
  91.     MOVE.B    #$30,(A1)        ;TRxC-Bar is Rcv Clock (External)
  92.                     ;BR Generator is Xmt Clock
  93. ; WR 14
  94.     MOVE.L    (SP),(SP)        ;(delay)
  95.     MOVE.B    #14,(A1)        ;WR 14
  96.     MOVE.L    (SP),(SP)        ;(delay)
  97.     MOVE.B    #$01,(A1)        ;BR Enable, no weird modes
  98. ; WR 15
  99.     MOVE.L    (SP),(SP)        ;(delay)
  100.     MOVE.B    #15,(A1)        ;WR 15
  101.     MOVE.L    (SP),(SP)        ;(delay)
  102.     MOVE.B    #$08,(A1)        ;Interrupt on CD Changes (Mouse)
  103. ; WR 0
  104.     MOVE.L    (SP),(SP)
  105.     MOVE.B    #$40,(A1)        ;Reset Rx CRC to WR 0
  106.     MOVE.L    (SP),(SP)
  107.     MOVE.B    #$40,(A1)        ;Reset Rx CRC to WR 0
  108. ; WR 9
  109.     MOVE.L    (SP),(SP)        ;(delay)
  110.     MOVE.B    #9,(A1)            ;WR 9
  111.     MOVE.L    (SP),(SP)        ;(delay)
  112.     MOVE.B    #$0A,(A1)        ;MIE and NV
  113.  
  114. ; turn off the motor
  115.     LEA    MotorOff,A2        ;address the motor off base
  116.     TST.B    (A2)            ;do a fetch
  117.  
  118. ; init the sound output buffer to FF's for smallest clip
  119.     MOVE.L    SoundBase,A2        ;init the sound buffer addr
  120.     MOVE.W    #SndBufWLen-1,D2    ;size of sound buffer
  121. @1    MOVE.B    #$FF,(A2)        ;set to 255
  122.     ADDQ.L    #2,A2            ;skip two bytes
  123.     DBF    D2,@1
  124.  
  125. ; wait for clock from box to start
  126.     MOVE.B    (A0),D0            ;assure WR 0 next
  127.     MOVEQ    #10,D1            ;flush first 10 samples
  128.     MOVE.L    (SP),(SP)        ;(delay)
  129. ; loop until at least one character is there
  130. @2    BTST.B    #0,(A0)            ;test RR 0 for data available
  131.     BEQ.S    @2            ;inner loop until a char is there
  132.     MOVE.B    4(A0),D0        ;receive the character
  133.     MOVEM.L    D0-D7,-(SP)        ;kill time
  134.     MOVEM.L    (SP)+,D0-D7
  135.     DBF    D1,@2            ;outer loop on characters read
  136.     
  137. ; set Screen to Black
  138.     MOVEA.L    ScrnBase,A2        ; SCREEN ADDRESS
  139.     MOVE.W    ScreenRow,D0        ;get byte width of screen
  140.     LSR.W    #2,D0            ;divided by 4
  141.     MULU    #MaxY,D0
  142.     SUBQ.W    #1,D0            ;loop count
  143. @3    MOVE.L    #$FFFFFFFF,(A2)+    ;set to ones 4 bytes
  144.     DBF    D0,@3
  145.  
  146. ; compute the place on screen to draw
  147.     MOVE.W    #myRow,D0        ; LOAD TOP SCAN OF SCOPE
  148.     MULU    ScreenRow,D0        ; times row length (clean)
  149.     MOVEA.L    ScrnBase,A3        ; SCREEN ADDRESS
  150.     ADDA.W    D0,A3            ; ADD ON OFFSET OF SCAN...
  151.  
  152. ; now draw white lines above and below 'scope region
  153.     MOVEA.L    A3,A2
  154.     SUBA.W    ScreenRow,A2
  155.     MOVE.W    ScreenRow,D0
  156.     LSR.W    #2,D0
  157.     SUBQ.W    #1,D0            ;loop count
  158. @4    CLR.L    (A2)+
  159.     DBF    D0,@4
  160.     MOVE.W    #257,D0
  161.     MULU    ScreenRow,D0        ; times row length (clean)
  162.     MOVEA.L    A3,A2
  163.     ADDA.W    D0,A2    
  164.     MOVE.W    ScreenRow,D0
  165.     LSR.W    #2,D0
  166.     SUBQ.W    #1,D0            ;loop count
  167. @5    CLR.L    (A2)+
  168.     DBF    D0,@5
  169.     
  170. ; turn on the sound
  171.     MOVE.L    VIA,A2            ;get VIA device address
  172.     BCLR    #VSndEnb,(A2)        ;clear the sound disable bit
  173.  
  174. ; receive characters and stuff them into the sound buffer
  175.     MOVE.W    #-trigC,D3        ;trigger count
  176.     MOVEQ    #(512/8)-1,D6        ;buffer byte count - 1
  177.     MOVEQ    #7,D7            ;complement bit
  178.     LEA    transTab(A5),A4        ;load translate table
  179.     LEA    oldVal(A5),A6        ;get start of old array
  180.  
  181. ; 'outer' loop resets the sound buffer
  182. riloop:    MOVE.L    SoundBase,A2        ;init the sound buffer addr
  183.     MOVE.W    #sndBufWLen-1,D4    ;words in sound buffer - 1 for DBF
  184.  
  185. ; D3 = 0: if scoping, <0: if waiting for TB clr, >0: if waiting for TB set
  186. ; D4 = sound buffer down ctr,
  187. ; D6 = buffer byte count - 1, D7 = bit in byte (complement)
  188. ; A0 = constant Scc Read Addr, A1 = constant Scc Write Addr,
  189. ; A2 = ptr into sound buffer, A3 = video byte ptr,
  190. ; A4 = constant transTab ptr, A5 = data region ptr,
  191. ; A6 = current ptr to oldVal array
  192. loop:    MOVEQ    #25,D0            ;clock off timeout
  193. wcloop:    BTST.B    #0,(A0)            ;test RR 0 for data available
  194.     BNE.S    gotdata            ;data is there!
  195. ; no data yet, count down and loop
  196.     DBF    D0,wcloop
  197. ; time out: the box must have been turned off
  198.     BRA.S    doneOsc            ;exit
  199.  
  200. ; we have a character!!!!!
  201. ; assume top byte of D0.W is zeroes!!!!
  202. gotdata    MOVE.B    4(A0),D0        ;receive the character
  203.     MOVE.B    0(A4,D0.W),D0        ;get translated value
  204.     MOVE.B    D0,(A2)            ;put translated byte to sound buf
  205.     ADDQ.L    #2,A2            ;bump sound buffer ptr
  206.     TST.W    D3            ;test 'scope mode
  207.     BEQ.S    @1            ;normal mode
  208.  
  209. ; waiting to trigger 'scope
  210.     BPL.S    @2            ;branch if waiting for < 0
  211. ; <0: waiting for top bit clear
  212.     TST.B    D0            ;test top bit
  213.     BPL.S    @3            ;branch if clear
  214.     ADDQ.W    #1,D3            ;count down
  215.     BRA.S    doloop
  216. @3    MOVE.W    #trigC,D3        ;wait for top bit set
  217.     BRA.S    doloop
  218. ; >0: waiting for top bit set
  219. @2    TST.B    D0            ;test sign of D0
  220.     BMI.S    @4            ;branch if set
  221.     SUBQ.W    #1,D3            ;count up
  222.     BRA.S    doloop
  223. @4    MOVEQ    #0,D3            ;we've triggered
  224.  
  225. ; output oscilloscope-like display to screen
  226. @1    LSL.W    #6,D0            ;shift into vertical byte offset
  227.     MOVE.W    (A6),D1            ;get old value
  228.     MOVE.W    D0,(A6)+        ;and replace with new one
  229.     BSET    D7,0(A3,D1.W)        ;clear the old bit
  230.     BCLR    D7,0(A3,D0.W)        ;set the current bit
  231.     SUBQ.W    #1,D7            ;decrement bit, N set if -1
  232.     BPL.S    doloop            ;no, loop quick
  233.  
  234.     MOVEQ    #7,D7            ;set bit to 7
  235.     ADDQ.L    #1,A3            ;bump to next horizontal byte
  236.     DBF    D6,doloop
  237.  
  238. ; test for aborted by mouse button down
  239.     MOVE.L    VIA,A3            ;get VIA device address
  240.     BTST    #vSW,(A3)
  241.     BNE.S    @9            ; no, reset video buffer and loop
  242. ; Aborted::: wait for mouse to rise upon the abort
  243. @8    BTST    #vSW,(A3)
  244.     BEQ.S    @8            ; loop until mouse is up
  245.     BRA.S    doneOsc
  246.  
  247. ; reset video buffer
  248. @9    MOVE.W    #-trigC,D3        ;reset trigger count
  249.     MOVEQ    #(512/8)-1,D6        ;buffer byte count - 1
  250. ; compute the place on screen to draw
  251.     MOVE.W    #myRow,D0        ; LOAD TOP SCAN OF SCOPE
  252.     MULU    ScreenRow,D0        ; times row length (clean)
  253.     MOVEA.L    ScrnBase,A3        ; SCREEN ADDRESS
  254.     ADDA.W    D0,A3            ; ADD ON OFFSET OF SCAN...
  255.     LEA    oldVal(A5),A6        ;get start of old array
  256.  
  257.  
  258. doloop:    DBF    D4,loop            ;count and test for Sound Buf empty
  259.     BRA    riloop            ;Reset Sound Buffer and Loop
  260.  
  261. ; done - clean things up
  262. ; turn internal clock on, enable BR generator, 
  263. doneOsc: MOVE.B    (A0),D0            ;assure WR0 next
  264. ; WR 5
  265.     MOVE.L    (SP),(SP)        ;(delay)
  266.     MOVE.B    #5,(A1)            ;WR 5
  267.     MOVE.L    (SP),(SP)        ;(delay)
  268.     MOVE.B    #$6A,(A1)        ;8 bits/char, Tx enable
  269. ; WR 11    
  270.     MOVE.L    (SP),(SP)        ;(delay)
  271.     MOVE.B    #11,(A1)        ;WR 11
  272.     MOVE.L    (SP),(SP)        ;(delay)
  273.     MOVE.B    #$50,(A1)        ;baudrate generator clocking
  274. ; WR 14
  275.     MOVE.L    (SP),(SP)        ;(delay)
  276.     MOVE.B    #14,(A1)        ;WR 14
  277.     MOVE.L    (SP),(SP)        ;(delay)
  278.     MOVE.B    #$01,(A1)        ;BR Enable, no weird modes
  279.  
  280. ; turn off the sound
  281.     MOVE.L    VIA,A2            ;get VIA device address
  282.     BSET    #VSndEnb,(A2)        ;set the sound disable bit
  283.  
  284. ; allow interrupts
  285.     ANDI    #$CFF,SR
  286.  
  287. ; return to shell
  288.     DC.W    $A9F4    ;_ExitToShell
  289.     
  290.     END